GitHub CLIの資格情報を1Passwordで管理し、バイオメトリクス認証で取得するようにしてみた
こんにちは、CX事業本部 Delivery部の若槻です。
1Password GitHubシェルプラグインを使用すると、GitHub CLIの資格情報をローカル端末にプレーンテキストで保存するのではなく、1Passwordを使用してバイオメトリクスまたはシステム認証でGitHub CLIを安全に認証することができます。
今回は、GitHub CLIの資格情報を1Passwordで管理し、指紋認証で取得するようにしてみました。
やってみた
要件
使用するための要件は以下となります。
- 1Passwordへのサインアップ
- 1Password 8アプリのインストール
- 1Password CLI 2.9.0以降
- 1Password CLIの1Passwordアプリとの接続
- GitHub CLIのインストール
私の環境では1Password CLIのバージョンが低かったためアップグレードが必要でした。
$ op --version 2.4.1
Homebrewでアップグレードします。
brew upgrade --cask 1password-cli
アップグレードできました。
op --version 2.13.1
参考:Update to the latest version of 1Password CLI | 1Password Developer
Personal access tokensの用意
GitHubで適切な権限を持ったPAT(Personal access tokens)を生成しておきます。
この時の注意点として、Fine-grained PATではなく、classic PATを使用する必要があります。
資格情報の構成
op plugin init gh
コマンドを実行して対話式で資格情報を構成していきます。
$ op plugin init gh GitHub CLI Authenticate with GitHub Personal Access Token. ? Locate your GitHub Personal Access Token: Import into 1Password... ? Enter or paste in the value of the Token: [? for help] *********************************************** ? Enter a name to save it in 1Password [default: "GitHub Personal Access Token"]: ? Select the vault to save the Personal Access Token in: Private Securely saved "GitHub Personal Access Token" in 1Password! ? Configure when "GitHub Personal Access Token" will be used to authenticate: Use automatically when in this directory or subdirectories The last step is to set up an alias for gh. You can do so by running the following command: echo "source /Users/wakatsuki.ryuta/.config/op/plugins.sh" >> ~/.zshrc && source ~/.zshrc Afterwards, run any gh command to see it in action!
Locate your GitHub Personal Access Token
では、既存のPATを使用するか1Passwordに新規インポートするかを指定します。Enter or paste in the value of the Token
では、インポートするPATのトークン値を指定します。Configure when "GitHub Personal Access Token" will be used to authenticate:
では、資格情報を適用する範囲を指定します。Prompt me for each new terminal session
:現在のターミナル セッションの間だけ資格情報を構成し、ターミナルを終了すると削除される。Use automatically when in this directory or subdirectories
:資格情報を現在のディレクトリとそのすべてのサブディレクトリのデフォルトに設定する。Use as global default on my system
:すべての端末セッションとディレクトリで認証情報をデフォルトとして設定する。
これによりGitHubのPATが1Passwordに管理され、GitHub CLI時に使用されるようになりました。
最後に表示されたコマンドを実行してplugins.sh
のPATHを通しておきます。
資格情報を使ってGitHub CLIの認証をする
構成した資格情報を使ってGitHub CLIの認証をしてみます。
gh repo list -L 1
1Passwordの指紋認証が求められました。
指紋認証が成功すると、コマンドを実行することができました。
注意点
GitHub CLIではFine-grained PATは使えない
Fine-grained personal access tokensを使用すると、従来のPersonal access tokens(classic PATs)に比べてきめ細かいアクセス権限をトークン設定することができます。
よって今回のGitHubシェルプラグインでもFine-grained PATを使いたいところでしたが、そもそもGitHub CLIではFine-grained PATは使えませんでした。内部的に使われているGraphQL APIでサポートされていないようです。
$ gh repo list HTTP 401: Personal access tokens with fine grained access do not support the GraphQL API (https://api.github.com/graphql) Try authenticating with: gh auth login
アクセス権限やアクセス対象のアカウントおよびリポジトリを絞れると良かったのですが、できないようです。
gitコマンドではgh auth loginの認証が使われる
GitHubシェルプラグインで構成した資格情報はgit pull
やgit push
などでも使用できると思っていたのですが、gitコマンドではもともとgh auth login
により構成していた資格情報が使われる動作となりました。
gh auth login
を使用する場合は資格情報をgitコマンドとghコマンド(GitHub CLI)で統一できていたので、GitHubシェルプラグインでこれができないのは少し不便ですね。
GitHubシェルプラグインの削除
最後に、GitHubシェルプラグインを削除して、元のgh auth login
により構成した資格情報を使えるように戻してみます。
資格情報をリセットするためには次のop plugin clear gh
を実行せよとのことなのでやってみます。
$ op plugin clear gh ? Stop automatically using "GitHub Personal Access Token" (vault: "Private") when in directory "/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/devio"? Yes Successfully cleared! GitHub CLI is now no longer using "GitHub Personal Access Token" to authenticate under the "/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/devio" directory. When you now run the next gh command, you'll be prompted again to select which Personal Access Token to use.
次回にghコマンドを実行する際にどのPATを使用するか再度プロンプトで選択するようになるとのことです。
ghコマンドを実行してみると、確かにそのようになりました。
$ gh repo list -L 1 ? Locate your GitHub Personal Access Token: [Use arrows to move, type to filter, ? for more help] > GitHub Personal Access Token (Private) GitHub Personal Access Token (Private) Import into 1Password... Search in 1Password..
plugins.sh
へのPATHを通すコマンドを~/.zshrc
から削除します。
ターミナルを再起動すると、元のgh auth login
により構成した資格情報でアクセスできるようになりました。
最後に1Passwordに格納されたPATをアプリから手動削除します。
おわりに
GitHub CLIの資格情報を1Passwordで管理し、指紋認証で取得するようにしてみました。
gitコマンドとの資格情報の共通化もできないため使い所が難しいと感じたのですが、ghコマンドだけを多用する使い方であればセキュリティ強化に一役買うのではないでしょうか。
以上